<!DOCTYPE html>
<html lang="zh-CN">

<head>
  <meta charset="UTF-8">
  <title>09-then返回值</title>
</head>

<body>
  <!--  promise.then()返回的新 promise 的结果状态由什么决定?
    (1) 简单表达: 由 then()指定的回调函数执行的结果决定 

    (2) 详细表达: 

    ​	 *1.返回了一个值，那么 then 返回的 Promise 将会成为 fulfilled 状态，
        并且将返回的值作为 fulfilled 状态的回调函数的参数值。*

  ​    *2.没有返回任何值，那么 then 返回的 Promise 将会成为 fulfilled 状态，
        并且该 fulfilled 状态的回调函数的参数值为 undefined。*

  ​    *3.抛出一个错误，那么 then 返回的 Promise 将会成为 rejected 状态，
        并且将抛出的错误作为 rejected 状态的回调函数的参数值。*

  ​    *4.返回一个已经是 fulfilled 状态的 Promise，那么 then 返回的 Promise 也会成为 fulfilled 状态，
        并且将那个 Promise 的 fulfilled 状态的回调函数的参数值作为该被返回的 Promise 的 fulfilled 状态回调函数的参数值。*

  ​    *5.返回一个已经是 rejected 状态的 Promise，那么 then 返回的 Promise 也会成为 rejected 状态，
        并且将那个 Promise 的 rejected 状态的回调函数的参数值作为该被返回的 Promise 的 rejected 状态回调函数的参数值。*

  ​    *6.返回一个未定状态（pending）的 Promise，那么 then 返回 Promise 的状态也是未定的，
        并且它的终态与那个 Promise 的终态相同；同时，它变为终态时调用的回调函数参数与那个 Promise 变为终态时的回调函数的参数是相同的。*
   -->

  <script>
    // 以下依次用6个then来证明上面的结论
    const promise = new Promise((resolve, reject) => {
      resolve('成功的value');
    })
      .then(
        (value) => {
          console.log('成功的value：' + value);   //成功的value：成功的value
          return '第一个then方法，ok'
        },
        (reason) => { console.log('失败原因：' + reason); }
      )
      .then(
        (value) => { console.log('成功的value：' + value); },   //成功的value：第一个then方法，ok
        (reason) => { console.log('失败原因：' + reason); }
      )
      .then(
        (value) => {
          console.log('成功的value：' + value);   //成功的value：undefined
          throw '第三个then抛出错误'
        },
        (reason) => { console.log('失败原因：' + reason); }
      )
      .then(
        (value) => { console.log('成功的value：' + value); },
        (reason) => {
          console.log('失败原因：' + reason);   //失败原因：第三个then抛出错误
          return Promise.resolve('第四个then返回一个成功的promise')
        }
      )
      .then(
        (value) => {
          console.log('成功的value：' + value);   //成功的value：第四个then返回一个成功的promise
          return Promise.reject('第五个then返回一个失败的promise')
        },
        (reason) => { console.log('失败原因：' + reason); }
      )
      .then(
        (value) => { console.log('成功的value：' + value); },
        (reason) => {
          console.log('失败原因：' + reason);   //失败原因：第五个then返回一个失败的promise
          return new Promise((resolve, reject) => { console.log('pending状态的promise'); })
        }
      )
    //输出最后一个then方法返回的promise，因为是pending状态，没法继续链式调用then()
    console.log(promise);   //Promise {<pending>}




  </script>
</body>

</html>